package de.khaled.diplom;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

/**
 * @author Khalid Abounnajah
 * 
 */
public class TestDatenGenerator {
	public enum Bereiche {
		KauferBereich(10000, 300), NutzenBereich(100, 70);
		private int mittelW;
		private int abweichungsw;

		Bereiche(int mw, int aw) {
			this.abweichungsw = aw;
			this.mittelW = mw;
		}
	}

	private double start_preis;

	public double getStart_preis() {
		return start_preis;
	}

	public void setStart_preis(double start_preis) {
		this.start_preis = start_preis;
	}

	public List<Gut> gut_liste = new ArrayList<>();
	public List<Kaeufer> kaeufer_liste = new ArrayList<>();

	public TestDatenGenerator(int anzk, int anzg, Bereiche kaueferbereich,
			Bereiche nutzenbereich) {
		for (int i = 1; i <= anzg; i++) {
			Gut gut = new Gut("gut" + i);
			gut_liste.add(gut);
		}

		for (int i = 1; i <= anzk; i++) {
			Kaeufer kaeufer = new Kaeufer("kaeufer" + i);
			kaeufer_liste.add(kaeufer);
		}

		setze_kaeufer_kapital(anzk, anzg, kaueferbereich, nutzenbereich);
		berechne_start_preis();
	}

	public void berechne_start_preis() {
		double minimal_kapital = 0;
		for (Kaeufer kaeufer : kaeufer_liste) {

			if (minimal_kapital == 0) {
				minimal_kapital = kaeufer.getKapital();
			}

			else {

				if (minimal_kapital >= kaeufer.getKapital()) {
					minimal_kapital = kaeufer.getKapital();
				}
			}

		}
		this.start_preis = minimal_kapital / gut_liste.size();
		setze_gut_start_preis(this.start_preis);

	}

	public void setze_gut_start_preis(double minimal_kapital) {

		for (Gut gut : gut_liste) {
			gut.setPreis(this.start_preis);
			gut.setRestPreis(gut.getPreis());
		}

	}

	public void setze_kaeufer_kapital(int anzk, int anzg,
			Bereiche kaueferbereich, Bereiche nutzenbereich) {
		// Kapital verteilen nach der Normalverteilung
		for (int i = 0; i < anzk; i++) {
			Random kr = new Random();
			int kapital = (int) Math.round(this.generateNormalFormValue(kr,
					kaueferbereich.abweichungsw, kaueferbereich.mittelW));
			kaeufer_liste.get(i).setKapital(kapital);
			kaeufer_liste.get(i).setRestKapital(kapital);
			for (int j = 0; j < anzg; j++) {
				// Nutzen verteilen nach der Normalverteilung
				Random nr = new Random();
				kaeufer_liste
						.get(i)
						.getNutzen()
						.put(gut_liste.get(j),
								this.generateNormalFormValue(nr,
										nutzenbereich.abweichungsw,
										nutzenbereich.mittelW) + 1);
			}
		}
	}

	public double generateNormalFormValue(Random ran, double sigma, double mu) {
		double delay;
		do {
			delay = ran.nextGaussian() * sigma + mu;
		} while (delay <= 0);

		return Math.round(delay * 100) / 100;
	}

	public void printKaeuferGueter() {
		for (Kaeufer k : kaeufer_liste) {
			System.out.println("Kaeufer name " + k.getName());
			System.out.println("Kaeufer Kapital " + k.getKapital());
			System.out.println("Kaeufer RestKapital " + k.getRestKapital());
			HashMap<Gut, Double> gute = (HashMap<Gut, Double>) k.getNutzen();
			for (Double g : gute.values()) {
				System.out.println("Gute " + g);
			}
		}
	}

	
}
